home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Aminet / util / conv / nocode.lha / nocode / nocode.e < prev    next >
Text File  |  1999-01-07  |  4KB  |  144 lines

  1. OPT OSVERSION=37
  2.  
  3. MODULE 'dos/dos'
  4.  
  5. ENUM ERR_NONE,ERR_READARGS,ERR_OPENREAD,ERR_EXAMINEFH,ERR_READ,ERR_READSHORT,
  6. ERR_OPENWRITE,ERR_WRITE,ERR_WRITESHORT
  7.  
  8. PROC main() HANDLE
  9.     DEF ver,args[4]:ARRAY OF LONG,rdargs=NIL,code,code2,
  10.     fhread=0,fib=0:PTR TO fileinfoblock,infilesize,buffer:PTR TO CHAR,read,
  11.     buffer2:PTR TO CHAR,outfilesize,changes,fhwrite=0,written
  12.  
  13.     ver:='$VER: nocode 1.0 (7.1.99)'
  14.     args:=[NIL,NIL,NIL,NIL]
  15.     buffer:=NIL
  16.     buffer2:=NIL
  17.  
  18.     IF (rdargs:=ReadArgs('INFILE/A,OUTFILE,CODE/N/A,REPLACECODE/N',args,NIL))=NIL THEN Raise(ERR_READARGS)
  19.     PrintF('\s\n',ver+6)
  20.     PrintF('--\n')
  21.     IF args[1]=NIL THEN args[1]:=args[0]
  22.     code:=args[2]
  23.     code:=^code
  24.     IF (code2:=args[3]) THEN code2:=^code2
  25.     IF (fhread:=Open(args[0],MODE_OLDFILE))=0 THEN Raise(ERR_OPENREAD)
  26.     NEW fib
  27.     IF (ExamineFH(fhread,fib))=FALSE THEN Raise(ERR_EXAMINEFH)
  28.     infilesize:=fib.size
  29.     END fib
  30.     fib:=0
  31.     NEW buffer[infilesize]
  32.     PrintF('Reading "\s"... ',args[0])
  33.     IF (read:=Read(fhread,buffer,infilesize))=-1 THEN Raise(ERR_READ)
  34.     IF (read<>infilesize) THEN Raise(ERR_READSHORT)
  35.     PrintF('read \d bytes.\n',read)
  36.     Close(fhread)
  37.     fhread:=0
  38.     NEW buffer2[infilesize]
  39.     IF args[3]
  40.         outfilesize:=infilesize
  41.         changes:=replacecode(buffer,buffer2,infilesize,code,code2)
  42.     ELSE
  43.         outfilesize:=removecode(buffer,buffer2,infilesize,code)
  44.     ENDIF
  45.     END buffer
  46.     buffer:=NIL
  47.     IF (fhwrite:=Open(args[1],MODE_NEWFILE))=0 THEN Raise(ERR_OPENWRITE)
  48.     IF args[1]=args[0]
  49.         PrintF('Overwriting "\s"... ',args[1])
  50.     ELSE
  51.         PrintF('Writing "\s"... ',args[1])
  52.     ENDIF
  53.     IF (written:=Write(fhwrite,buffer2,outfilesize))=-1 THEN Raise(ERR_WRITE)
  54.     IF (written<>outfilesize) THEN Raise(ERR_WRITESHORT)
  55.     PrintF('wrote \d bytes.\n\n',written)
  56. EXCEPT DO
  57.     IF fhwrite THEN Close(fhwrite)
  58.     IF buffer2 THEN END buffer2
  59.     IF buffer THEN END buffer
  60.     IF fib THEN END fib
  61.     IF fhread THEN Close(fhread)
  62.     IF rdargs THEN FreeArgs(rdargs)
  63.     SELECT exception
  64.         CASE ERR_READARGS
  65.             PrintF('nocode - Bad commandline arguments (ReadArgs).\n')
  66.         CASE ERR_OPENREAD
  67.             PrintF('Cannot open "\s" for reading (Open).\n',args[0])
  68.         CASE ERR_EXAMINEFH
  69.             PrintF('Cannot examine filehandle (ExamineFH).\n')
  70.         CASE ERR_READ
  71.             PrintF('Cannot read "\s" (Read).\n',args[0])
  72.         CASE ERR_READSHORT
  73.             PrintF('Cannot read "\s" - read data short (Read).\n',args[0])
  74.         CASE ERR_OPENWRITE
  75.             PrintF('Cannot open "\s" for writing (Open).\n',args[1])
  76.         CASE ERR_WRITE
  77.             PrintF('Cannot write "\s" (Write).\n',args[1])
  78.         CASE ERR_WRITESHORT
  79.             PrintF('Cannot write "\s" - written data short (Write).\n',args[1])
  80.         CASE "MEM"
  81.             PrintF('Cannot allocate enough (approx. \d bytes) memory (NEW).\n',Shl(infilesize,1))
  82.     ENDSELECT
  83. ENDPROC
  84.  
  85. PROC removecode(buffer,buffer2,bufferlen,code)
  86. DEF outfilesize
  87.  
  88.     PrintF('Removing code \d... ',code)
  89.     MOVE.L buffer,A0 -> buffer 1
  90.     MOVE.L buffer2,A1 -> buffer 2
  91.     MOVE.L A1,A2 -> buffer 2 (to calculate length of stripped file later)
  92.     MOVE.L code,D0 -> cache code in D0
  93.     MOVE.L bufferlen,D1 -> buffer length
  94.     SUBQ.L #1,D1 -> decrement for dbcc
  95.     ADD.L #$10000,D1 -> increment upper word (outerloop must jump to innerloop at least once)
  96.     BRA.S startouterloop
  97. outerloop:
  98.     SWAP D1 -> fetch lower word of counter
  99. innerloop:
  100.     MOVE.B (A0)+,D2 -> next char
  101.     CMP.B D0,D2 -> compare with code
  102.     BEQ.S remove -> = then remove it
  103.     MOVE.B D2,(A1)+ -> <> then copy it into buffer2
  104. remove:
  105.     DBF D1,innerloop
  106. startouterloop:
  107.     SWAP D1 -> fetch upper word of counter
  108.     DBF D1,outerloop
  109.     SUB.L A2,A1 -> subtract original buffer2 address from buffer2
  110.     MOVE.L A1,outfilesize
  111.     PrintF('done (\d characters removed).\n',bufferlen-outfilesize)
  112. ENDPROC outfilesize
  113.  
  114. PROC replacecode(buffer,buffer2,bufferlen,code,code2)
  115. DEF changes
  116.  
  117.     PrintF('Replacing code \d with code \d... ',code,code2)
  118.     MOVE.L buffer,A0 -> buffer 1
  119.     MOVE.L buffer2,A1 -> buffer 2
  120.     MOVE.L code,D0 -> cache code in D0
  121.     MOVE.L code2,D3 -> cache code2 in D0
  122.     MOVE.L bufferlen,D1 -> buffer length
  123.     SUBQ.L #1,D1 -> decrement for dbcc
  124.     ADD.L #$10000,D1 -> increment upper word (outerloop must jump to innerloop at least once)
  125.     MOVEQ #0,D4
  126.     BRA.S startouterloop2
  127. outerloop2:
  128.     SWAP D1 -> fetch lower word of counter
  129. innerloop2:
  130.     MOVE.B (A0)+,D2 -> next char
  131.     CMP.B D0,D2 -> compare with code
  132.     BNE.S dontreplace -> <> then leave it unchanged
  133.     MOVE.B D3,D2
  134.     ADDQ.L #1,D4
  135. dontreplace:
  136.     MOVE.B D2,(A1)+ -> copy (possibly replaced) char into buffer2
  137.     DBF D1,innerloop2
  138. startouterloop2:
  139.     SWAP D1 -> fetch upper word of counter
  140.     DBF D1,outerloop2
  141.     MOVE.L D4,changes
  142.     PrintF('done (\d characters replaced).\n',changes)
  143. ENDPROC changes
  144.